#include "FileTools.h"
#include <iostream>
#include <fstream>

// 读取文件中的所有内容
std::string FileTools::ReadAll(const std::string &filePath)
{
    // 打开文件
    std::ifstream f(filePath);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return ""; // {}   std::string();
    }
    // 拿文件大小
    f.seekg(0, std::ios::end); // 先移到文件末尾
    long size = f.tellg(); // 拿它的大小
    f.seekg(0, std::ios::beg); // 再移到文件开头

    char *p = new char[size + 1];
    f.read(p, size);
    std::string data = p;
    delete[] p;

    f.close();
    return data;
}

// 按行读取文件
std::vector<std::string> FileTools::ReadLine(const std::string &filePath)
{
    std::ifstream f(filePath);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return {}; // {}   std::string();
    }

    std::vector<std::string> vec;
    while(f.eof() == false)
    {
        std::string LineData;

        // >> ：不能读取完整的一行数据，遇到\n 空格 \t都会停止
        // f >> LineData; 

        // getline会把空行去掉
        std::getline(f, LineData);

        // 过滤空行
        if(LineData != "")
            vec.push_back(std::move(LineData));

        // 用移动语义，有效减少数据拷贝
        vec.push_back(std::move(LineData));
    }
    f.close();
    return vec;
}

// 覆盖写
bool FileTools::WriteToFile(const std::string &filePath, const std::string &data)
{
    std::ofstream f(filePath);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return false; // {}   std::string();
    }
    f.write(data.c_str(), data.size());
    f.close();
    return true;
}

// 追加写
bool FileTools::AppendToFile(const std::string &filePath, const std::string &data)
{
    std::ofstream f(filePath, std::ios::app);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return false; // {}   std::string();
    }
    f.write(data.c_str(), data.size());
    f.close();
    return true;
}

// 按行写
bool FileTools::WriteLine(const std::string &filePath, std::vector<std::string> &strVec)
{
    std::ofstream f(filePath);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return false; // {}   std::string();
    }
    for(auto &str : strVec)
    {
        f.write(str.c_str(), str.size());
        f << "\n";
    }
    
    f.close();
    return true;
}

bool FileTools::AppendLine(const std::string &filePath, std::vector<std::string> &strVec)
{
    std::ofstream f(filePath, std::ios::app);
    if(!f.is_open())
    {
        std::cout << filePath << "打开失败!\n";
        return false; // {}   std::string();
    }
    for(auto &str : strVec)
    {
        f.write(str.c_str(), str.size());
        f << "\n";
    }
    f.close();
    return false;
}

// 创建文件夹
void FileTools::MakeDir(const std::string &path)
{
    std::string cmd = "mkdir " + path;
    system(cmd.c_str());
}

void FileTools::RemoveDir(const std::string &path)
{
    std::string cmd = "rm -rf " + path;
    system(cmd.c_str());
}